Given an integer array nums, find the maximum possible bitwise OR of a subset of nums and return the number of different non-empty subsets with the maximum bitwise OR.
An array a is a subset of an array b if a can be obtained from b by deleting some (possibly zero) elements of b. Two subsets are considered different if the indices of the elements chosen are different.
The bitwise OR of an array a is equal to a[0] OR a[1] OR ... OR a[a.length - 1] (0-indexed).
題目給咱一個整數陣列nums,找到其中某個子集合的最大可能位元運算OR,目標是返回具有這個最大位元OR的不同非空子集合數量。
題目給的子集合定義:陣列a是陣列b的子集合,a可以通過從b中刪除一些(也可以不刪)元素得到。當選取元素的索引不同時,兩個子集合被認為是不同的。
我的解題思路:
0. 總之先找出OR語法:原來就是很常用的“ | ”
class Solution {
public int countMaxOrSubsets(int[] nums) {
int maxOr = 0;
int count = 0;
// 最大OR值
for (int num : nums) {
maxOr |= num; // 把目前數字的OR加到maxOr
}
// 以下參考自chatgpt
count = countSubsets(nums, 0, 0, maxOr);
return count;
}
private static int countSubsets(int[] nums, int index, int currentOr, int maxOr) {
// index:目前遍歷到的索引
// currentOr:目前為止選擇的子集合的OR結果
// 遍歷完所有後,檢查當前OR值是否等於maxOr
if (index == nums.length) {
return currentOr == maxOr ? 1 : 0;
}
// 遞迴計算 包含當前元素 和 不包含當前元素 的情況
int in = countSubsets(nums, index + 1, currentOr | nums[index], maxOr);
int out = countSubsets(nums, index + 1, currentOr, maxOr);
return in + out;
}
}
題目雖然看得懂,但是實際開始寫程式的時候卻不知道該如何把思路表達成程式碼,最後還是依賴了AI
也許是我不熟悉二進制的邏輯閘運算吧?所以才手忙腳亂...總之一些相關的知識就邊做邊學吧!